// defaults是默认值对象。partial是部分配置属性。合并partial非null和非undefined属性给defaults。 不允许新增属性
export function mergeWithDefaultsStrict<T extends U, U extends Record<string, unknown>>(
  partial: Partial<T>,
  defaults: U,
): U {
  const result = { ...defaults }
  // 显式类型断言确保 key 是 U 的合法属性
  for (const key in partial) {
    if (hasKey(defaults, key)) {
      const value = partial[key]
      if (value !== null && value !== undefined) {
        result[key] = value
      }
    }
  }
  return result
}
// defaults是默认值对象。partial是部分配置属性。合并partial非null和非undefined属性给defaults。 允许新增属性
export function mergeWithDefaults<T extends object, U extends object>(
  partial: T,
  defaults: U,
): T & U {
  const result = { ...defaults };

  (Object.keys(partial) as Array<keyof T>).forEach((key) => {
    const value = partial[key]
    if (value !== null && value !== undefined) {
      (result as Record<string, unknown>)[key as string] = value
    }
  })

  return result as T & U
}
// 类型安全的 hasKey 检查函数
function hasKey<U extends Record<string, unknown>>(
  obj: U,
  key: string | number | symbol,
): key is keyof U {
  return Object.prototype.hasOwnProperty.call(obj, key)
}
